package javaCode.chapter09.codeblock_;

public class CodeBlockDetail01 {
    public static void main(String[] args) {

        //类被加载的情况举例
        //1、创建对象实例时(new)
        //new AA();
        //2、创建子类对象时，父类也会被加载 , 而且 父类会先加载 子类后加载
        //AA aa2 = new AA();
        //3、使用静态成员/变量
        //System.out.println(Cat.age);

        //static代码块，是在类加载时，执行的，而且只会执行一次
        //new DD();
        //new DD();

        //普通的代码块，在创建对象实例时，会被隐式的调用。
        //被创建一次，就会调用一次
        //如果只是使用类的静态成员时，普通代码块并不会执行。
        System.out.println(DD.n1);
    }
}

class DD{
    public static int n1 = 10;
    static {
        System.out.println("DD 的静态代码块被执行...");
    }
    //普通代码块，在创建(new) 对象时被调用，每创建一次，就调用一次 和类加载没关系
    //可以这样简单的理解，普通代码块是 构造器的补充
    {
        System.out.println("DD 普通代码块被执行...");
    }
}

class Animal {
    static {
        System.out.println("Animal 的静态代码块被执行...");
    }
}

class Cat extends Animal{
    public static int age = 10; //静态属性

    static {
        System.out.println("Cat 的静态代码块被执行...");
    }
}


class BB {
    //静态代码块
    static {
        System.out.println("BB 的静态代码块1被执行...");
    }
}

class AA extends BB {
    //静态代码块
    static {
        System.out.println("AA 的静态代码块1被执行...");
    }
}

